Tumor evolution project

Data used

In this notebook, we are using the tmb_genomic.tsv file generated from the 01-preprocess-data.Rmd script.

Set up

suppressPackageStartupMessages({
  library(tidyverse)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder. This will be in the project root directory.
# Use this as the root directory to ensure proper sourcing of functions
# no matter where this is called from.
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
scratch_dir <- file.path(root_dir, "scratch")
analysis_dir <- file.path(root_dir, "analyses", "tmb-vaf-longitudinal") 
input_dir <- file.path(analysis_dir, "input")

# Input files
tmb_genomic_file <- file.path(scratch_dir, "tmb_genomic.tsv")
tumor_descriptor_color_palette_file <- file.path(root_dir, "figures", "palettes", "tumor_descriptor_color_palette.tsv")

# File path to plots directory
plots_dir <-
  file.path(analysis_dir, "plots")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

source(paste0(analysis_dir, "/util/function-create-barplot.R"))
source(paste0(root_dir, "/figures/scripts/theme.R"))

Read in data and process

# Read and process tmb_genomic file
tmb_genomic_all <- readr::read_tsv(tmb_genomic_file, guess_max = 100000, show_col_types = FALSE) 

# Are there any samples with both WGS and WXS? 
tmb_genomic_all %>% 
  unique() %>% 
  arrange(Kids_First_Participant_ID, experimental_strategy)  %>%
  group_by(Kids_First_Participant_ID) %>%
  dplyr::summarise(experimental_strategy_sum = str_c(experimental_strategy, collapse = ";")) 

# Yes, they are, so let's remove these from downstream analyses.
tmb_genomic <- tmb_genomic_all %>% 
  filter(!experimental_strategy == "WXS") %>% 
  mutate(tumor_descriptor_order = case_when(grepl("Diagnosis", tumor_descriptor) ~ "1",
                                          grepl("Recurrence", tumor_descriptor) ~ "2",
                                          grepl("Progressive", tumor_descriptor) ~ "3",
                                          grepl("Deceased", tumor_descriptor) ~ "4",
                                          grepl("Second Malignancy", tumor_descriptor) ~ "5",
                                          grepl("Unavailable", tumor_descriptor) ~ "6")) %>% 
  arrange(tumor_descriptor_order, descriptors) %>% 
 # create plot order by tumor_descriptor and descriptors
  mutate(plot_order = row_number())

# Read color palette
tumor_descriptor_color_palette <- readr::read_tsv(tumor_descriptor_color_palette_file, guess_max = 100000, show_col_types = FALSE)

TMB per Patient case

We will explore TMB per Kids_First_Participant_ID over time by creating stacked barplots.

# Define parameters for function
ylim <- 360
tmb_df <- tmb_genomic

# Run function
fname <- paste0(plots_dir, "/", "TMB-genomic.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic.pdf"
p <- create_stacked_barplot(tmb_df = tmb_df, ylim = ylim)
pdf(file = fname, width = 15, height = 6)
print(p)
dev.off()
quartz_off_screen 
                2 

Attention: Low TMB defined as ≤5 mutations/Mb, intermediate TMB defined as >5 and ≤20/Mb, high TMB defined as >20 and ≤50 Mb, and very high TMB defined as >50 mutations/Mb.

Here, we notice that there are samples with high TMB (hyper-mutant samples). Next, we will exclude these samples (threshold >= 50) from downstream analysis. Attention is needed in cases with high number of mutations in only one timepoint as this will lead to un-matched longitudinal samples. We will also remove those so we always have matched longitudinal samples.

# Filter df
tmb_genomic_filter <- tmb_genomic %>%
  filter(!tmb >= 50)  %>%
  unique() %>% 
  arrange(Kids_First_Participant_ID, tumor_descriptor) %>%
  group_by(Kids_First_Participant_ID) %>%
  dplyr::summarise(tumor_descriptor_sum = str_c(tumor_descriptor, collapse = ";")) %>% 
  filter(!tumor_descriptor_sum %in% c("Diagnosis", "Progressive", "Recurrence")) %>% 
  dplyr::left_join(tmb_genomic, by = c("Kids_First_Participant_ID", "tumor_descriptor_sum")) %>% 
  mutate(cancer_group_sum = ifelse(short_histology == "HGAT", "High-grade glioma",
                                   ifelse(short_histology == "LGAT", "Low-grade glioma", "Other cancer group")),
         cancer_group_sum = replace_na(cancer_group_sum, "Other"),
         patient_id = paste(short_histology, Kids_First_Participant_ID, sep = "_")) %>% 
  drop_na(tmb) %>% 
  arrange(tumor_descriptor_order, descriptors) %>% 
 # create plot order by tumor_descriptor and descriptors
  mutate(plot_order = row_number())


# Define parameters for function
ylim <- 12.5
tmb_df <- tmb_genomic_filter

# Run function
fname <- paste0(plots_dir, "/", "TMB-genomic-no-hypermutants.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-no-hypermutants.pdf"
p <- create_stacked_barplot(tmb_df = tmb_df, ylim = ylim)
pdf(file = fname, width = 15, height = 8)
print(p)
dev.off()
quartz_off_screen 
                2 

TMB per Patient case and Cancer type

We will explore TMB per cancer group over time by creating stacked barplots. We will plot based on cancer groups presenting with the highest number of samples (High- and Low-grade gliomas) vesrus any other cancer groups.

cancer_groups <- unique(as.character(tmb_genomic_filter$cancer_group_sum))
cancer_groups <- sort(cancer_groups, decreasing = FALSE)
print(cancer_groups)
[1] "High-grade glioma"  "Low-grade glioma"   "Other cancer group"
for (i in seq_along(cancer_groups)) {
  print(i)
  tmb_genomic_filter_sub <- tmb_genomic_filter %>%
    filter(cancer_group_sum == cancer_groups [i])
  
  if (i == 1) {
    print(cancer_groups [i])
    # Define parameters for function
    ylim <- 12.5
    } else if (i == 2) {
      print(cancer_groups [i])
      # Define parameters for function
      ylim <- 4.5
      } else {
        print(cancer_groups [i])
        # Define parameters for function
        ylim <- 8
      }
    
    # Name plots
    fname <- paste0(plots_dir, "/", "TMB-genomic", "-", cancer_groups[i], ".pdf")
    print(fname)
    
    # Run function
    p <- create_stacked_barplot_ct(tmb_df = tmb_genomic_filter_sub, 
                                 ylim = ylim, 
                                 ct_id = cancer_groups[i])
    pdf(file = fname, width = 12, height = 6)
    print(p)
    dev.off()

}
[1] 1
[1] "High-grade glioma"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-High-grade glioma.pdf"
[1] 2
[1] "Low-grade glioma"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-Low-grade glioma.pdf"
[1] 3
[1] "Other cancer group"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-Other cancer group.pdf"

Number of mutations per Patient case and biospecimen sample

Here, we want to explore the number of mutations (mutation_count column) per timepoint and biospecimen sample per patient case by creating barplots.

tmb_genomic_filter_samples <- tmb_genomic_filter %>% 
  arrange(tumor_descriptor_order, Kids_First_Biospecimen_ID) %>% 
 # create plot order 
  mutate(plot_order = row_number())

samples <- unique(as.character(tmb_genomic_filter_samples$Kids_First_Participant_ID))
print(samples)
 [1] "PT_TKWTTRQ7" "PT_XHYBZKCX" "PT_3T3VGWC6" "PT_K8ZV7APT" "PT_962TCBVR" "PT_XA98HG1C" "PT_02J5CWN5" "PT_YGN06RPZ" "PT_S4YNE17X"
[10] "PT_1ZAWNGWT" "PT_QH9H491G" "PT_RJ1TJ2KH" "PT_Z4GS3ZQQ" "PT_3R0P995B" "PT_99S5BPE3" "PT_JNEV57VK" "PT_82MX6J77" "PT_2FVTD0WR"
[19] "PT_W6AWJJK7" "PT_ZZRBX5JT" "PT_3VCS1PPF" "PT_FN4GEEFR" "PT_MNSEJCDM" "PT_T2M1338J" "PT_KMHGNCNR" "PT_AQWDQW27" "PT_37B5JRP1"
[28] "PT_89XRZBSG" "PT_ZMKMKCFQ" "PT_JSFBMK5V" "PT_CXT81GRM" "PT_98QMQZY7" "PT_00G007DM" "PT_XTVQB9S4" "PT_PR4YBBH3" "PT_7M2PGCBV"
[37] "PT_ESHACWF6" "PT_N8W26H19" "PT_25Z2NX27" "PT_NPETR8RY" "PT_JP1FDKN9" "PT_9S6WMQ92" "PT_PFA762TK" "PT_HJMP6PH2" "PT_WP871F5S"
[46] "PT_MDWPRDBT" "PT_HFQNKP5X" "PT_2ECVKTTQ" "PT_8GN3TQRM" "PT_9PJR0ZK7" "PT_S2SQJVGK" "PT_2YT37G8P" "PT_DFQAH7RS" "PT_1H2REHT2"
for (i in seq_along(samples)) {
  print(i)
  tmb_sub <- tmb_genomic_filter_samples %>%
    filter(Kids_First_Participant_ID == samples[i])
  
  if (i %in% c(42, 37, 16, 1, 38, 52)) { # "PT_9S6WMQ92", "PT_ESHACWF6", "PT_JNEV57VK", "PT_TKWTTRQ7",  "PT_N8W26H19", "PT_2YT37G8P"
    print(samples[i])
    # Define parameters for function
    ylim <- 260
    } else if (i %in% c(27, 31, 30, 6, 38, 28,  15, 49, 47, 46, 50, 54)) { 
      print(samples[i])
      # Define parameters for function
      ylim <- 100 # "PT_37B5JRP1", "PT_CXT81GRM", "PT_JSFBMK5V", "PT_XA98HG1C", "PT_N8W26H19",  "PT_89XRZBSG","PT_99S5BPE3", "PT_8GN3TQRM", "PT_HFQNKP5X", "PT_MDWPRDBT",  "PT_9PJR0ZK7", "PT_1H2REHT2"
      } else {
        print(samples[i])
        # Define parameters for function
        ylim <- 50
      } 
 
  # Run function
  fname <- paste0(plots_dir, "/", samples[i], "-TMB-barplot.pdf")
  print(fname)
  p <- create_barplot_sample(tmb_df = tmb_sub,
                             ylim = ylim,
                             sid = samples[i])
  pdf(file = fname, width = 5, height = 4)
  print(p)
  dev.off()
}
[1] 1
[1] "PT_TKWTTRQ7"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_TKWTTRQ7-TMB-barplot.pdf"
[1] 2
[1] "PT_XHYBZKCX"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XHYBZKCX-TMB-barplot.pdf"
[1] 3
[1] "PT_3T3VGWC6"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3T3VGWC6-TMB-barplot.pdf"
[1] 4
[1] "PT_K8ZV7APT"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_K8ZV7APT-TMB-barplot.pdf"
[1] 5
[1] "PT_962TCBVR"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_962TCBVR-TMB-barplot.pdf"
[1] 6
[1] "PT_XA98HG1C"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XA98HG1C-TMB-barplot.pdf"
[1] 7
[1] "PT_02J5CWN5"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_02J5CWN5-TMB-barplot.pdf"
[1] 8
[1] "PT_YGN06RPZ"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_YGN06RPZ-TMB-barplot.pdf"
[1] 9
[1] "PT_S4YNE17X"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S4YNE17X-TMB-barplot.pdf"
[1] 10
[1] "PT_1ZAWNGWT"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1ZAWNGWT-TMB-barplot.pdf"
[1] 11
[1] "PT_QH9H491G"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_QH9H491G-TMB-barplot.pdf"
[1] 12
[1] "PT_RJ1TJ2KH"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_RJ1TJ2KH-TMB-barplot.pdf"
[1] 13
[1] "PT_Z4GS3ZQQ"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_Z4GS3ZQQ-TMB-barplot.pdf"
[1] 14
[1] "PT_3R0P995B"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3R0P995B-TMB-barplot.pdf"
[1] 15
[1] "PT_99S5BPE3"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_99S5BPE3-TMB-barplot.pdf"
[1] 16
[1] "PT_JNEV57VK"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JNEV57VK-TMB-barplot.pdf"
[1] 17
[1] "PT_82MX6J77"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_82MX6J77-TMB-barplot.pdf"
[1] 18
[1] "PT_2FVTD0WR"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2FVTD0WR-TMB-barplot.pdf"
[1] 19
[1] "PT_W6AWJJK7"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_W6AWJJK7-TMB-barplot.pdf"
[1] 20
[1] "PT_ZZRBX5JT"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZZRBX5JT-TMB-barplot.pdf"
[1] 21
[1] "PT_3VCS1PPF"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3VCS1PPF-TMB-barplot.pdf"
[1] 22
[1] "PT_FN4GEEFR"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_FN4GEEFR-TMB-barplot.pdf"
[1] 23
[1] "PT_MNSEJCDM"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-TMB-barplot.pdf"
[1] 24
[1] "PT_T2M1338J"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_T2M1338J-TMB-barplot.pdf"
[1] 25
[1] "PT_KMHGNCNR"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KMHGNCNR-TMB-barplot.pdf"
[1] 26
[1] "PT_AQWDQW27"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_AQWDQW27-TMB-barplot.pdf"
[1] 27
[1] "PT_37B5JRP1"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_37B5JRP1-TMB-barplot.pdf"
[1] 28
[1] "PT_89XRZBSG"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_89XRZBSG-TMB-barplot.pdf"
[1] 29
[1] "PT_ZMKMKCFQ"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZMKMKCFQ-TMB-barplot.pdf"
[1] 30
[1] "PT_JSFBMK5V"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JSFBMK5V-TMB-barplot.pdf"
[1] 31
[1] "PT_CXT81GRM"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_CXT81GRM-TMB-barplot.pdf"
[1] 32
[1] "PT_98QMQZY7"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_98QMQZY7-TMB-barplot.pdf"
[1] 33
[1] "PT_00G007DM"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_00G007DM-TMB-barplot.pdf"
[1] 34
[1] "PT_XTVQB9S4"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XTVQB9S4-TMB-barplot.pdf"
[1] 35
[1] "PT_PR4YBBH3"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PR4YBBH3-TMB-barplot.pdf"
[1] 36
[1] "PT_7M2PGCBV"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_7M2PGCBV-TMB-barplot.pdf"
[1] 37
[1] "PT_ESHACWF6"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ESHACWF6-TMB-barplot.pdf"
[1] 38
[1] "PT_N8W26H19"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_N8W26H19-TMB-barplot.pdf"
[1] 39
[1] "PT_25Z2NX27"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_25Z2NX27-TMB-barplot.pdf"
[1] 40
[1] "PT_NPETR8RY"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_NPETR8RY-TMB-barplot.pdf"
[1] 41
[1] "PT_JP1FDKN9"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JP1FDKN9-TMB-barplot.pdf"
[1] 42
[1] "PT_9S6WMQ92"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9S6WMQ92-TMB-barplot.pdf"
[1] 43
[1] "PT_PFA762TK"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PFA762TK-TMB-barplot.pdf"
[1] 44
[1] "PT_HJMP6PH2"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HJMP6PH2-TMB-barplot.pdf"
[1] 45
[1] "PT_WP871F5S"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_WP871F5S-TMB-barplot.pdf"
[1] 46
[1] "PT_MDWPRDBT"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MDWPRDBT-TMB-barplot.pdf"
[1] 47
[1] "PT_HFQNKP5X"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HFQNKP5X-TMB-barplot.pdf"
[1] 48
[1] "PT_2ECVKTTQ"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2ECVKTTQ-TMB-barplot.pdf"
[1] 49
[1] "PT_8GN3TQRM"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_8GN3TQRM-TMB-barplot.pdf"
[1] 50
[1] "PT_9PJR0ZK7"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9PJR0ZK7-TMB-barplot.pdf"
[1] 51
[1] "PT_S2SQJVGK"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S2SQJVGK-TMB-barplot.pdf"
[1] 52
[1] "PT_2YT37G8P"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2YT37G8P-TMB-barplot.pdf"
[1] 53
[1] "PT_DFQAH7RS"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_DFQAH7RS-TMB-barplot.pdf"
[1] 54
[1] "PT_1H2REHT2"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1H2REHT2-TMB-barplot.pdf"

sessionInfo()
R version 4.2.3 (2023-03-15)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.4.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggpubr_0.6.0    gridExtra_2.3   cowplot_1.1.1   ggthemes_4.2.4  Rmisc_1.5.1     plyr_1.8.8      lattice_0.21-8  lubridate_1.9.2
 [9] forcats_1.0.0   stringr_1.5.0   dplyr_1.1.2     purrr_1.0.1     readr_2.1.4     tidyr_1.3.0     tibble_3.2.1    ggplot2_3.4.2  
[17] tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.11       rprojroot_2.0.3   digest_0.6.33     utf8_1.2.3        R6_2.5.1          backports_1.4.1   evaluate_0.21    
 [8] pillar_1.9.0      rlang_1.1.1       rstudioapi_0.15.0 data.table_1.14.8 car_3.1-2         jquerylib_0.1.4   rmarkdown_2.23   
[15] labeling_0.4.2    bit_4.0.5         munsell_0.5.0     broom_1.0.5       compiler_4.2.3    xfun_0.39         pkgconfig_2.0.3  
[22] htmltools_0.5.5   tidyselect_1.2.0  fansi_1.0.4       crayon_1.5.2      tzdb_0.4.0        withr_2.5.0       jsonlite_1.8.7   
[29] gtable_0.3.3      lifecycle_1.0.3   magrittr_2.0.3    scales_1.2.1      cli_3.6.1         stringi_1.7.12    vroom_1.6.3      
[36] cachem_1.0.8      carData_3.0-5     farver_2.1.1      ggsignif_0.6.4    bslib_0.5.0       generics_0.1.3    vctrs_0.6.3      
[43] tools_4.2.3       bit64_4.0.5       glue_1.6.2        hms_1.1.3         abind_1.4-5       parallel_4.2.3    fastmap_1.1.1    
[50] yaml_2.3.7        timechange_0.2.0  colorspace_2.1-0  rstatix_0.7.2     knitr_1.43        sass_0.4.7       
LS0tCnRpdGxlOiAiQ3JlYXRlIFRNQiBiYXJwbG90cyBvZiB0dW1vcnMgYWNyb3NzIG11bHRpcGxlIHRpbWVwb2ludHMgb2YgdGhlIFBCVEEgQ29ob3J0IgphdXRob3I6ICJBbnRvbmlhIENocm9uaSA8Y2hyb25pYUBjaG9wLmVkdT4gZm9yIEQzQiIKZGF0ZTogIjIwMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgojIyMjIFR1bW9yIGV2b2x1dGlvbiBwcm9qZWN0IAoKIyMjIERhdGEgdXNlZCAKSW4gdGhpcyBub3RlYm9vaywgd2UgYXJlIHVzaW5nIHRoZSBgdG1iX2dlbm9taWMudHN2YCBmaWxlIGdlbmVyYXRlZCBmcm9tIHRoZSBgMDEtcHJlcHJvY2Vzcy1kYXRhLlJtZGAgc2NyaXB0LgoKIyBTZXQgdXAKYGBge3IgbG9hZC1saWJyYXJ5fQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQp9KQpgYGAKCiMgRGlyZWN0b3JpZXMgYW5kIEZpbGUgSW5wdXRzL091dHB1dHMKYGBge3Igc2V0LWRpci1hbmQtZmlsZS1uYW1lc30KIyBEZXRlY3QgdGhlICIuZ2l0IiBmb2xkZXIuIFRoaXMgd2lsbCBiZSBpbiB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KIyBVc2UgdGhpcyBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gZW5zdXJlIHByb3BlciBzb3VyY2luZyBvZiBmdW5jdGlvbnMKIyBubyBtYXR0ZXIgd2hlcmUgdGhpcyBpcyBjYWxsZWQgZnJvbS4Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCnNjcmF0Y2hfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgInNjcmF0Y2giKQphbmFseXNpc19kaXIgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAidG1iLXZhZi1sb25naXR1ZGluYWwiKSAKaW5wdXRfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJpbnB1dCIpCgojIElucHV0IGZpbGVzCnRtYl9nZW5vbWljX2ZpbGUgPC0gZmlsZS5wYXRoKHNjcmF0Y2hfZGlyLCAidG1iX2dlbm9taWMudHN2IikKdHVtb3JfZGVzY3JpcHRvcl9jb2xvcl9wYWxldHRlX2ZpbGUgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiZmlndXJlcyIsICJwYWxldHRlcyIsICJ0dW1vcl9kZXNjcmlwdG9yX2NvbG9yX3BhbGV0dGUudHN2IikKCiMgRmlsZSBwYXRoIHRvIHBsb3RzIGRpcmVjdG9yeQpwbG90c19kaXIgPC0KICBmaWxlLnBhdGgoYW5hbHlzaXNfZGlyLCAicGxvdHMiKQppZiAoIWRpci5leGlzdHMocGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUocGxvdHNfZGlyKQp9Cgpzb3VyY2UocGFzdGUwKGFuYWx5c2lzX2RpciwgIi91dGlsL2Z1bmN0aW9uLWNyZWF0ZS1iYXJwbG90LlIiKSkKc291cmNlKHBhc3RlMChyb290X2RpciwgIi9maWd1cmVzL3NjcmlwdHMvdGhlbWUuUiIpKQpgYGAKCiMgUmVhZCBpbiBkYXRhIGFuZCBwcm9jZXNzCmBgYHtyIHJlYWRfaW5wdXRfZmlsZXN9CiMgUmVhZCBhbmQgcHJvY2VzcyB0bWJfZ2Vub21pYyBmaWxlCnRtYl9nZW5vbWljX2FsbCA8LSByZWFkcjo6cmVhZF90c3YodG1iX2dlbm9taWNfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAKCiMgQXJlIHRoZXJlIGFueSBzYW1wbGVzIHdpdGggYm90aCBXR1MgYW5kIFdYUz8gCnRtYl9nZW5vbWljX2FsbCAlPiUgCiAgdW5pcXVlKCkgJT4lIAogIGFycmFuZ2UoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgZXhwZXJpbWVudGFsX3N0cmF0ZWd5KSAgJT4lCiAgZ3JvdXBfYnkoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShleHBlcmltZW50YWxfc3RyYXRlZ3lfc3VtID0gc3RyX2MoZXhwZXJpbWVudGFsX3N0cmF0ZWd5LCBjb2xsYXBzZSA9ICI7IikpIAoKIyBZZXMsIHRoZXkgYXJlLCBzbyBsZXQncyByZW1vdmUgdGhlc2UgZnJvbSBkb3duc3RyZWFtIGFuYWx5c2VzLgp0bWJfZ2Vub21pYyA8LSB0bWJfZ2Vub21pY19hbGwgJT4lIAogIGZpbHRlcighZXhwZXJpbWVudGFsX3N0cmF0ZWd5ID09ICJXWFMiKSAlPiUgCiAgbXV0YXRlKHR1bW9yX2Rlc2NyaXB0b3Jfb3JkZXIgPSBjYXNlX3doZW4oZ3JlcGwoIkRpYWdub3NpcyIsIHR1bW9yX2Rlc2NyaXB0b3IpIH4gIjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiUmVjdXJyZW5jZSIsIHR1bW9yX2Rlc2NyaXB0b3IpIH4gIjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiUHJvZ3Jlc3NpdmUiLCB0dW1vcl9kZXNjcmlwdG9yKSB+ICIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIkRlY2Vhc2VkIiwgdHVtb3JfZGVzY3JpcHRvcikgfiAiNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJTZWNvbmQgTWFsaWduYW5jeSIsIHR1bW9yX2Rlc2NyaXB0b3IpIH4gIjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiVW5hdmFpbGFibGUiLCB0dW1vcl9kZXNjcmlwdG9yKSB+ICI2IikpICU+JSAKICBhcnJhbmdlKHR1bW9yX2Rlc2NyaXB0b3Jfb3JkZXIsIGRlc2NyaXB0b3JzKSAlPiUgCiAjIGNyZWF0ZSBwbG90IG9yZGVyIGJ5IHR1bW9yX2Rlc2NyaXB0b3IgYW5kIGRlc2NyaXB0b3JzCiAgbXV0YXRlKHBsb3Rfb3JkZXIgPSByb3dfbnVtYmVyKCkpCgojIFJlYWQgY29sb3IgcGFsZXR0ZQp0dW1vcl9kZXNjcmlwdG9yX2NvbG9yX3BhbGV0dGUgPC0gcmVhZHI6OnJlYWRfdHN2KHR1bW9yX2Rlc2NyaXB0b3JfY29sb3JfcGFsZXR0ZV9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmBgYAoKIyBUTUIgcGVyIFBhdGllbnQgY2FzZQpXZSB3aWxsIGV4cGxvcmUgVE1CIHBlciBgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRGAgb3ZlciB0aW1lIGJ5IGNyZWF0aW5nIHN0YWNrZWQgYmFycGxvdHMuCgpgYGB7ciBjcmVhdGUtc3RhY2tlZC1iYXJwbG90LCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp5bGltIDwtIDM2MAp0bWJfZGYgPC0gdG1iX2dlbm9taWMKCiMgUnVuIGZ1bmN0aW9uCmZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgIlRNQi1nZW5vbWljLnBkZiIpCnByaW50KGZuYW1lKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3QodG1iX2RmID0gdG1iX2RmLCB5bGltID0geWxpbSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gNikKcHJpbnQocCkKZGV2Lm9mZigpCmBgYApBdHRlbnRpb246IExvdyBUTUIgZGVmaW5lZCBhcyDiiaQ1IG11dGF0aW9ucy9NYiwgaW50ZXJtZWRpYXRlIFRNQiBkZWZpbmVkIGFzID41IGFuZCDiiaQyMC9NYiwgaGlnaCBUTUIgZGVmaW5lZCBhcyA+MjAgYW5kIOKJpDUwIE1iLCBhbmQgdmVyeSBoaWdoIFRNQiBkZWZpbmVkIGFzID41MCBtdXRhdGlvbnMvTWIuCgpIZXJlLCB3ZSBub3RpY2UgdGhhdCB0aGVyZSBhcmUgc2FtcGxlcyB3aXRoIGhpZ2ggVE1CIChoeXBlci1tdXRhbnQgc2FtcGxlcykuIE5leHQsIHdlIHdpbGwgZXhjbHVkZSB0aGVzZSBzYW1wbGVzICh0aHJlc2hvbGQgPj0gNTApIGZyb20gZG93bnN0cmVhbSBhbmFseXNpcy4gQXR0ZW50aW9uIGlzIG5lZWRlZCBpbiBjYXNlcyB3aXRoIGhpZ2ggbnVtYmVyIG9mIG11dGF0aW9ucyBpbiBvbmx5IG9uZSB0aW1lcG9pbnQgYXMgdGhpcyB3aWxsIGxlYWQgdG8gdW4tbWF0Y2hlZCBsb25naXR1ZGluYWwgc2FtcGxlcy4gV2Ugd2lsbCBhbHNvIHJlbW92ZSB0aG9zZSBzbyB3ZSBhbHdheXMgaGF2ZSBtYXRjaGVkIGxvbmdpdHVkaW5hbCBzYW1wbGVzLgoKYGBge3IgY3JlYXRlLXN0YWNrZWQtYmFycGxvdC1maWx0ZXIsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gOCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CiMgRmlsdGVyIGRmCnRtYl9nZW5vbWljX2ZpbHRlciA8LSB0bWJfZ2Vub21pYyAlPiUKICBmaWx0ZXIoIXRtYiA+PSA1MCkgICU+JQogIHVuaXF1ZSgpICU+JSAKICBhcnJhbmdlKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHR1bW9yX2Rlc2NyaXB0b3IpICU+JQogIGdyb3VwX2J5KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UodHVtb3JfZGVzY3JpcHRvcl9zdW0gPSBzdHJfYyh0dW1vcl9kZXNjcmlwdG9yLCBjb2xsYXBzZSA9ICI7IikpICU+JSAKICBmaWx0ZXIoIXR1bW9yX2Rlc2NyaXB0b3Jfc3VtICVpbiUgYygiRGlhZ25vc2lzIiwgIlByb2dyZXNzaXZlIiwgIlJlY3VycmVuY2UiKSkgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4odG1iX2dlbm9taWMsIGJ5ID0gYygiS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCIsICJ0dW1vcl9kZXNjcmlwdG9yX3N1bSIpKSAlPiUgCiAgbXV0YXRlKGNhbmNlcl9ncm91cF9zdW0gPSBpZmVsc2Uoc2hvcnRfaGlzdG9sb2d5ID09ICJIR0FUIiwgIkhpZ2gtZ3JhZGUgZ2xpb21hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hvcnRfaGlzdG9sb2d5ID09ICJMR0FUIiwgIkxvdy1ncmFkZSBnbGlvbWEiLCAiT3RoZXIgY2FuY2VyIGdyb3VwIikpLAogICAgICAgICBjYW5jZXJfZ3JvdXBfc3VtID0gcmVwbGFjZV9uYShjYW5jZXJfZ3JvdXBfc3VtLCAiT3RoZXIiKSwKICAgICAgICAgcGF0aWVudF9pZCA9IHBhc3RlKHNob3J0X2hpc3RvbG9neSwgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgc2VwID0gIl8iKSkgJT4lIAogIGRyb3BfbmEodG1iKSAlPiUgCiAgYXJyYW5nZSh0dW1vcl9kZXNjcmlwdG9yX29yZGVyLCBkZXNjcmlwdG9ycykgJT4lIAogIyBjcmVhdGUgcGxvdCBvcmRlciBieSB0dW1vcl9kZXNjcmlwdG9yIGFuZCBkZXNjcmlwdG9ycwogIG11dGF0ZShwbG90X29yZGVyID0gcm93X251bWJlcigpKQoKCiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCnlsaW0gPC0gMTIuNQp0bWJfZGYgPC0gdG1iX2dlbm9taWNfZmlsdGVyCgojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJUTUItZ2Vub21pYy1uby1oeXBlcm11dGFudHMucGRmIikKcHJpbnQoZm5hbWUpCnAgPC0gY3JlYXRlX3N0YWNrZWRfYmFycGxvdCh0bWJfZGYgPSB0bWJfZGYsIHlsaW0gPSB5bGltKQpwZGYoZmlsZSA9IGZuYW1lLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSA4KQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIFRNQiBwZXIgUGF0aWVudCBjYXNlIGFuZCBDYW5jZXIgdHlwZQpXZSB3aWxsIGV4cGxvcmUgVE1CIHBlciBjYW5jZXIgZ3JvdXAgb3ZlciB0aW1lIGJ5IGNyZWF0aW5nIHN0YWNrZWQgYmFycGxvdHMuIFdlIHdpbGwgcGxvdCBiYXNlZCBvbiBjYW5jZXIgZ3JvdXBzIHByZXNlbnRpbmcgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygc2FtcGxlcyAoSGlnaC0gYW5kIExvdy1ncmFkZSBnbGlvbWFzKSB2ZXNydXMgYW55IG90aGVyIGNhbmNlciBncm91cHMuCgpgYGB7ciBjcmVhdGUtc3RhY2tlZC1iYXJwbG90LWZpbHRlci1jYW5jZXItZ3JvdXAtc3VtLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQpjYW5jZXJfZ3JvdXBzIDwtIHVuaXF1ZShhcy5jaGFyYWN0ZXIodG1iX2dlbm9taWNfZmlsdGVyJGNhbmNlcl9ncm91cF9zdW0pKQpjYW5jZXJfZ3JvdXBzIDwtIHNvcnQoY2FuY2VyX2dyb3VwcywgZGVjcmVhc2luZyA9IEZBTFNFKQpwcmludChjYW5jZXJfZ3JvdXBzKQoKZm9yIChpIGluIHNlcV9hbG9uZyhjYW5jZXJfZ3JvdXBzKSkgewogIHByaW50KGkpCiAgdG1iX2dlbm9taWNfZmlsdGVyX3N1YiA8LSB0bWJfZ2Vub21pY19maWx0ZXIgJT4lCiAgICBmaWx0ZXIoY2FuY2VyX2dyb3VwX3N1bSA9PSBjYW5jZXJfZ3JvdXBzIFtpXSkKICAKICBpZiAoaSA9PSAxKSB7CiAgICBwcmludChjYW5jZXJfZ3JvdXBzIFtpXSkKICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICB5bGltIDwtIDEyLjUKICAgIH0gZWxzZSBpZiAoaSA9PSAyKSB7CiAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogICAgICB5bGltIDwtIDQuNQogICAgICB9IGVsc2UgewogICAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgICAgeWxpbSA8LSA4CiAgICAgIH0KICAgIAogICAgIyBOYW1lIHBsb3RzCiAgICBmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJUTUItZ2Vub21pYyIsICItIiwgY2FuY2VyX2dyb3Vwc1tpXSwgIi5wZGYiKQogICAgcHJpbnQoZm5hbWUpCiAgICAKICAgICMgUnVuIGZ1bmN0aW9uCiAgICBwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3RfY3QodG1iX2RmID0gdG1iX2dlbm9taWNfZmlsdGVyX3N1YiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSB5bGltLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RfaWQgPSBjYW5jZXJfZ3JvdXBzW2ldKQogICAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gNikKICAgIHByaW50KHApCiAgICBkZXYub2ZmKCkKCn0KYGBgCgojIE51bWJlciBvZiBtdXRhdGlvbnMgcGVyIFBhdGllbnQgY2FzZSBhbmQgYmlvc3BlY2ltZW4gc2FtcGxlCkhlcmUsIHdlIHdhbnQgdG8gZXhwbG9yZSB0aGUgbnVtYmVyIG9mIG11dGF0aW9ucyAoYG11dGF0aW9uX2NvdW50YCBjb2x1bW4pIHBlciB0aW1lcG9pbnQgYW5kIGJpb3NwZWNpbWVuIHNhbXBsZSBwZXIgcGF0aWVudCBjYXNlIGJ5IGNyZWF0aW5nIGJhcnBsb3RzLgoKYGBge3IgY3JlYXRlLWJhcnBsb3Qtc2FtcGxlLCBmaWcud2lkdGggPSA1LCBmaWcuaGVpZ2h0ID0gNCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CnRtYl9nZW5vbWljX2ZpbHRlcl9zYW1wbGVzIDwtIHRtYl9nZW5vbWljX2ZpbHRlciAlPiUgCiAgYXJyYW5nZSh0dW1vcl9kZXNjcmlwdG9yX29yZGVyLCBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEKSAlPiUgCiAjIGNyZWF0ZSBwbG90IG9yZGVyIAogIG11dGF0ZShwbG90X29yZGVyID0gcm93X251bWJlcigpKQoKc2FtcGxlcyA8LSB1bmlxdWUoYXMuY2hhcmFjdGVyKHRtYl9nZW5vbWljX2ZpbHRlcl9zYW1wbGVzJEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKQpwcmludChzYW1wbGVzKQoKZm9yIChpIGluIHNlcV9hbG9uZyhzYW1wbGVzKSkgewogIHByaW50KGkpCiAgdG1iX3N1YiA8LSB0bWJfZ2Vub21pY19maWx0ZXJfc2FtcGxlcyAlPiUKICAgIGZpbHRlcihLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEID09IHNhbXBsZXNbaV0pCiAgCiAgaWYgKGkgJWluJSBjKDQyLCAzNywgMTYsIDEsIDM4LCA1MikpIHsgIyAiUFRfOVM2V01ROTIiLCAiUFRfRVNIQUNXRjYiLCAiUFRfSk5FVjU3VksiLCAiUFRfVEtXVFRSUTciLCAgIlBUX044VzI2SDE5IiwgIlBUXzJZVDM3RzhQIgogICAgcHJpbnQoc2FtcGxlc1tpXSkKICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICB5bGltIDwtIDI2MAogICAgfSBlbHNlIGlmIChpICVpbiUgYygyNywgMzEsIDMwLCA2LCAzOCwgMjgsICAxNSwgNDksIDQ3LCA0NiwgNTAsIDU0KSkgeyAKICAgICAgcHJpbnQoc2FtcGxlc1tpXSkKICAgICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgICAgeWxpbSA8LSAxMDAgIyAiUFRfMzdCNUpSUDEiLCAiUFRfQ1hUODFHUk0iLCAiUFRfSlNGQk1LNVYiLCAiUFRfWEE5OEhHMUMiLCAiUFRfTjhXMjZIMTkiLCAgIlBUXzg5WFJaQlNHIiwiUFRfOTlTNUJQRTMiLCAiUFRfOEdOM1RRUk0iLCAiUFRfSEZRTktQNVgiLCAiUFRfTURXUFJEQlQiLCAgIlBUXzlQSlIwWks3IiwgIlBUXzFIMlJFSFQyIgogICAgICB9IGVsc2UgewogICAgICAgIHByaW50KHNhbXBsZXNbaV0pCiAgICAgICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgICAgICB5bGltIDwtIDUwCiAgICAgIH0gCiAKICAjIFJ1biBmdW5jdGlvbgogIGZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgc2FtcGxlc1tpXSwgIi1UTUItYmFycGxvdC5wZGYiKQogIHByaW50KGZuYW1lKQogIHAgPC0gY3JlYXRlX2JhcnBsb3Rfc2FtcGxlKHRtYl9kZiA9IHRtYl9zdWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxpbSA9IHlsaW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkID0gc2FtcGxlc1tpXSkKICBwZGYoZmlsZSA9IGZuYW1lLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQpgYGAKCmBgYHtyIGVjaG89VFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAK